package com.qire.common.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.ImageDecoder;
import android.graphics.ImageDecoder.Source;
import android.graphics.ImageDecoder.ImageInfo;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;

import java.io.File;
import java.io.IOException;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.core.content.FileProvider;

/**
 * 系统兼容工具
 */
public final class OSCompatUtil {

    private OSCompatUtil() {
        throw new UnsupportedOperationException("不能初始化这个工具");
    }

    /**
     * 通过文件获取Uri，这个方法是系统兼容的。
     * @param context 上下文对象
     * @param file 目标文件
     * @return {@code file} 转换得到的 {@link Uri}
     */
    public static Uri uriFromFile(Context context, File file) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            // 参见 ： AndroidManifest.xml <provider android:authorities="com.qire.manhua.android7.my_provider" />
            return FileProvider.getUriForFile(context, "com.qire.manhua.android7.my_provider", file);
        } else {
            return Uri.fromFile(file);
        }
    }

    /**
     * 通过Uri获取Bitmap,这个方法是系统兼容的
     * @param context 上下文对象
     * @param bitmapUri bitmap的Uri
     * @return bitmap，如果发生IO异常则可能返回null
     */
    public static Bitmap bitmapFromUri(Context context, Uri bitmapUri) {
        try {
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                Source source = ImageDecoder.createSource(context.getContentResolver(), bitmapUri);
                return ImageDecoder.decodeBitmap(source, OSCompatUtil::onHeaderDecoded);
            } else {
//                return BitmapFactory.decodeStream(context.getContentResolver().openInputStream(bitmapUri));
                return MediaStore.Images.Media.getBitmap(context.getContentResolver(), bitmapUri);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @RequiresApi(api = Build.VERSION_CODES.P)
    private static void onHeaderDecoded(@NonNull ImageDecoder decoder, @NonNull ImageInfo info, @NonNull Source source) {
        // 解决在 canvas 绘制时报 Software rendering doesn't support hardware bitmaps 异常
        decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE);
    }

}
